home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 May / EnigmA AMIGA RUN 18 (1997)(G.R. Edizioni)(IT)[!][issue 1997-05][EAR-CD II].iso / earcd / dev / mui / mui37_de.lha / Amiga-E / Examples / Class1.e < prev    next >
Text File  |  1996-08-25  |  6KB  |  206 lines

  1. /*
  2. ** Demosource on how to use customclasses in E.
  3. ** Based on the C example 'Class1.c'.
  4. ** Translated to E by Jan Hendrik Schulz
  5. */
  6.  
  7. OPT PREPROCESS
  8.  
  9. MODULE 'muimaster', 'libraries/mui', 'libraries/muip',
  10.        'mui/muicustomclass', 'amigalib/boopsi',
  11.        'intuition/classes', 'intuition/classusr',
  12.        'intuition/screens', 'intuition/intuition',
  13.        'utility/tagitem'
  14.  
  15. /***************************************************************************/
  16. /* Here is the beginning of our simple new class...                        */
  17. /***************************************************************************/
  18.  
  19. /*
  20. ** This is an example for the simplest possible MUI class. It's just some
  21. ** kind of custom image and supports only two methods: 
  22. ** MUIM_AskMinMax and MUIM_Draw.
  23. */
  24.  
  25. /*
  26. ** This is the instance data for our custom class.
  27. ** Since it's a very simple class, it contains just a dummy entry.
  28. */
  29.  
  30. OBJECT mydata
  31.     dummy:LONG
  32. ENDOBJECT
  33.  
  34.  
  35. /*
  36. ** AskMinMax method will be called before the window is opened
  37. ** and before layout takes place. We need to tell MUI the
  38. ** minimum, maximum and default size of our object.
  39. */
  40.  
  41. PROC mAskMinMax(cl:PTR TO iclass,obj,msg:PTR TO muip_askminmax)
  42.  
  43.     /*
  44.     ** let our superclass first fill in what it thinks about sizes.
  45.     ** this will e.g. add the size of frame and inner spacing.
  46.     */
  47.  
  48.     doSuperMethodA(cl,obj,msg)
  49.  
  50.     /*
  51.     ** now add the values specific to our object. note that we
  52.     ** indeed need to *add* these values, not just set them!
  53.     */
  54.  
  55.     msg.minmaxinfo.minwidth := msg.minmaxinfo.minwidth + 100
  56.     msg.minmaxinfo.defwidth := msg.minmaxinfo.defwidth + 120
  57.     msg.minmaxinfo.maxwidth := msg.minmaxinfo.maxwidth + 500
  58.  
  59.     msg.minmaxinfo.minheight := msg.minmaxinfo.minheight + 40
  60.     msg.minmaxinfo.defheight := msg.minmaxinfo.defheight + 90
  61.     msg.minmaxinfo.maxheight := msg.minmaxinfo.maxheight + 300
  62.  
  63. ENDPROC 0
  64.  
  65.  
  66. /*
  67. ** Draw method is called whenever MUI feels we should render
  68. ** our object. This usually happens after layout is finished
  69. ** or when we need to refresh in a simplerefresh window.
  70. ** Note: You may only render within the rectangle
  71. **       _mleft(obj), _mtop(obj), _mwidth(obj), _mheight(obj).
  72. */
  73.  
  74. -> Note2: The following 'obj' isn't really a 'PTR TO mydata',
  75. ->        but obj must be a 'PTR TO <someobject>' to use the
  76. ->        macros like _mleft() etc. (see comments in mui.e)
  77. ->        I hope Wouter will change this in a futur version
  78. ->        of E !
  79.  
  80. PROC mDraw(cl:PTR TO iclass,obj:PTR TO mydata,msg:PTR TO muip_draw)
  81.  
  82.     DEF i
  83.  
  84.     /*
  85.     ** let our superclass draw itself first, area class would
  86.     ** e.g. draw the frame and clear the whole region. What
  87.     ** it does exactly depends on msg.flags.
  88.     */
  89.  
  90.     doSuperMethodA(cl,obj,msg)
  91.  
  92.     /*
  93.     ** if MADF_DRAWOBJECT isn't set, we shouldn't draw anything.
  94.     ** MUI just wanted to update the frame or something like that.
  95.     */
  96.  
  97.     IF (msg.flags AND MADF_DRAWOBJECT)=0 THEN RETURN 0
  98.  
  99.     /*
  100.     ** ok, everything ready to render...
  101.     */
  102.  
  103.     SetAPen(_rp(obj),_dri(obj).pens[TEXTPEN])
  104.  
  105.     FOR i:=_mleft(obj) TO _mright(obj) STEP 5
  106.         Move(_rp(obj),_mleft(obj),_mbottom(obj))
  107.         Draw(_rp(obj),i,_mtop(obj))
  108.         Move(_rp(obj),_mright(obj),_mbottom(obj))
  109.         Draw(_rp(obj),i,_mtop(obj))
  110.     ENDFOR
  111.  
  112. ENDPROC 0
  113.  
  114.  
  115. /*
  116. ** Here comes the dispatcher for our custom class. We only need to
  117. ** care about MUIM_AskMinMax and MUIM_Draw in this simple case.
  118. ** Unknown/unused methods are passed to the superclass immediately.
  119. */
  120.  
  121. PROC myDispatcher(cl:PTR TO iclass,obj,msg:PTR TO msg)
  122.     DEF methodID
  123.  
  124.     methodID:=msg.methodid
  125.     SELECT methodID
  126.         CASE MUIM_AskMinMax; RETURN mAskMinMax(cl,obj,msg)
  127.         CASE MUIM_Draw     ; RETURN mDraw     (cl,obj,msg)
  128.     ENDSELECT
  129.  
  130.     RETURN doSuperMethodA(cl,obj,msg)
  131. ENDPROC
  132.  
  133.  
  134.  
  135. /***************************************************************************/
  136. /* Thats all there is about it. Now lets see how things are used...        */
  137. /***************************************************************************/
  138.  
  139. PROC main() HANDLE
  140.  
  141.     DEF app=NIL,window,myobj,sigs=0,
  142.         mcc=NIL:PTR TO mui_customclass
  143.  
  144.     IF (muimasterbase:=OpenLibrary(MUIMASTER_NAME, MUIMASTER_VMIN))=NIL THEN
  145.         Raise('Failed to open muimaster.library')
  146.  
  147.     /* Create the new custom class with a call to eMui_CreateCustomClass().*/
  148.  
  149.     IF (mcc:=eMui_CreateCustomClass(NIL,MUIC_Area,NIL,SIZEOF mydata,{myDispatcher}))=NIL THEN
  150.         Raise('Could not create custom class.')
  151.  
  152.     app:=ApplicationObject,
  153.         MUIA_Application_Title      , 'Class1',
  154.         MUIA_Application_Version    , '$VER: Class1 12.9E (26.11.95)',
  155.         MUIA_Application_Copyright  , '©1993, Stefan Stuntz',
  156.         MUIA_Application_Author     , 'Stefan Stuntz & JHS',
  157.         MUIA_Application_Description, 'Demonstrate the use of custom classes.',
  158.         MUIA_Application_Base       , 'CLASS1',
  159.  
  160.         SubWindow, window := WindowObject,
  161.             MUIA_Window_Title, 'A Simple Custom Class',
  162.             MUIA_Window_ID   , "CLS1",
  163.             WindowContents, VGroup,
  164.  
  165.                 Child, myobj := NewObjectA(mcc.mcc_class,NIL,
  166.                     [TextFrame,
  167.                     MUIA_Background, MUII_BACKGROUND,
  168.                    End,
  169.                 End,
  170.             End,
  171.         End
  172.  
  173.     IF app=NIL THEN Raise('Failed to create Application.')
  174.  
  175.     doMethodA(window,[MUIM_Notify,MUIA_Window_CloseRequest,MUI_TRUE,
  176.               app,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit])
  177.  
  178.  
  179. /*
  180. ** This is the ideal input loop for an object oriented MUI application.
  181. ** Everything is encapsulated in classes, no return ids need to be used,
  182. ** we just check if the program shall terminate.
  183. ** Note that MUIM_Application_NewInput expects sigs to contain the result
  184. ** from Wait() (or 0). This makes the input loop significantly faster.
  185. */
  186.  
  187.     set(window,MUIA_Window_Open,MUI_TRUE)
  188.  
  189.     WHILE Not(doMethodA(app,[MUIM_Application_NewInput,{sigs}]) = MUIV_Application_ReturnID_Quit)
  190.         IF sigs THEN sigs := Wait(sigs)
  191.     ENDWHILE
  192.  
  193.     set(window,MUIA_Window_Open,FALSE)
  194.  
  195. /*
  196. ** Shut down...
  197. */
  198.  
  199. EXCEPT DO
  200.     IF app THEN Mui_DisposeObject(app)                /* dispose all objects. */
  201.     IF mcc THEN Mui_DeleteCustomClass(mcc)            /* delete the custom class. */
  202.     IF muimasterbase THEN CloseLibrary(muimasterbase) /* close library */
  203.     IF exception THEN WriteF('\s\n',exception)
  204. ENDPROC
  205.  
  206.